cdh发行版下Phoenix on hbase的使用

介绍

Apache Phoenix项目由saleforce开源并贡献给Apache基金会,目前为Apache基金会的顶级项目。它是构建在HBase上的SQL中间层。 Phoenix会将用户编写的sql查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端,小范围的查询可做到毫秒级响应,千万数据的响应速度为秒级。

引子

最近在不断给公司大数据平台添加新组件,这次是Phoenix,这个组件的一大吸引力是为hbase提供二级索引的功能。关于Phoenix的架构和功能介绍,网上文档有很多,这里就不班门弄斧了。这里主要记录一下组件添加过程中遇到的难点吧。

首先遇到的问题就是版本问题,目前公司这边大数据平台的hbase版本有三个可选项

  • hbase-1.0-cdh5.4.4
  • hbase-1.2-cdh5.8
  • hbase-1.2-cdh5.13.3

Phoenix本身的部署是很简单的,将Phoenix server的jar包拷贝到hbase的lib目录下, 然后重启hbase服务就好。从Phoenix官网下载到Phoenix包大多是apache版本的,只有少量的cdh版本有二进制包发布,开始抱着侥幸心理,直接把apache版本的jar包拷贝到hbase lib目录下,发现是不行的。查了下Google和stackoverflow,发现最好的办法就是自己手动去编译了,很庆幸找到了github已经有外国大大搞好了库(链接),然后,我就下载对应版本的包,配置好java和maven环境,跟着指导完成了编译工作。

然后再从Phoenix官网下载apache版本的二进制包,并将保重的jar包删除,将上一步自己编译出的全部jar包拷贝进来,如此,三个版本的phoenix包就制作完成了。

使用

在完成Phoenix的安装后,进入Phoenix客户端目录,使用命令行工具:

  1. 选择集群master或者core节点,进入客户端目录

    1
    2
    # 这里我们选择master1节点
    cd /home/hadoop/phoenix/bin
  2. 使用Phoenix python命令行工具

1
2
3
4
./sqlline.py uhadoop-xxx-master1:2181


0: jdbc:phoenix:uhadoop-xxxx-master1>
  1. 使用sql操纵Phoenix表

参考文档:https://phoenix.apache.org/language/index.html#create

tips:

Phoenix会自动将表名和字段名转换为大写字母,如果不想转换的话可以使用双引号把字段或者表名括起来

  • 使用帮助,查看全部Phoenix命令

    1
    0: jdbc:phoenix> !help
  • 查看table列表

    1
    0: jdbc:phoenix> !table
  • 创建新表

1
2
3
4
5
0: jdbc:phoenix:> 
create table test (
mykey integer not null primary key,
mycolumn varchar
);
  • 插入数据

    1
    2
    0: jdbc:phoenix:> upsert into test values (1,'uhadoop');
    0: jdbc:phoenix:> upsert into test values (2,'phoenix');
  • 查看表内容

1
0: jdbc:phoenix:> select * from test;
  • 删除表内容
1
0: jdbc:phoenix:> delete from test where mykey=1;
  • 为表创建索引
1
0: jdbc:phoenix:> create local index test_idx on test(mycolumn);
  • 查看表的索引信息
1
0: jdbc:phoenix:> !indexes test
  • 删除表
1
0: jdbc:phoenix:> drop table if exists test;
  • 退出客户端
1
0: jdbc:phoenix:>!exit
  1. 使用Phoenix与已有hbase表建立表映射关系
  • 4.1 进入hbase shell命令行创建表并插入数据
1
2
3
4
5
6
7
[root@uhadoop-xxx-master1 bin]# hbase shell

hbase(main):009:0> create 'phoenix','info'

hbase(main):010:0> put 'phoenix', 'row001','info:name','phoenix'

hbase(main):011:0> scan 'phoenix'
  • 4.2 进入Phoenix python客户端,建立映射关系

tips:

1.Phoenix 4.10 及以上的版本,Phoenix对列对编码格式有所改变(官网说明文档),所以在建立与hbase映射关系时,需要设置 COLUMN_ENCODED_BYTES 属性为 0,即不让 Phoenix 对 column family 进行编码。

2.HBase数据表默认主键列名是ROW

3.为了防止Phoenix自动将小写column转大写,需要用双引号将column扩起来

4.如果映射关系建立成功,建标之后可以看到有多少行数据被影响

  • 创建表映射

    1
    2
    0: jdbc:phoenix:> create table "phoenix"("ROW" varchar primary key, "info"."name" varchar) column_encoded_bytes=0;
    1 row affected (6.523 seconds)
  • 删除表(注意,这里hbase中表也会被同时删除)

1
0: jdbc:phoenix:> drop table "phoenix";
  1. 使用Phoenix与已有hbase表建立视图映射关系

如果Phoenix表只是做查询操作对话,做表映射是个更好对选择,做表映射,如果在Phoenix客户端删除表,则hbase中该表也将被删除。 如果是用视图映射,则删除视图不会影响原有表的数据。

  • 5.1 创建视图映射
1
2
# 如果hbase中不存在phoenix表,需要按照4.1节的方式在hbase中建表
0: jdbc:phoenix:> create view "phoenix"("ROW" varchar primary key, "info"."name" varchar);
  • 5.2 查询视图
1
0: jdbc:phoenix:>select * from "phoenix";
  • 5.3 删除视图
1
0: jdbc:phoenix:> drop view "phoenix";

6.使用phoenix自带工具执行sql脚本

  • 6.1 创建测试脚本 test.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
# cd /home/hadoop/phoenix/bin 
# 创建测试脚本: vim test.sql

-- create table user
create table if not exists user (id varchar primary key,account varchar ,passwd varchar);

-- insert data
upsert into user(id, account, passwd) values('001', 'admin', 'admin');
upsert into user(id, account, passwd) values('002', 'test', 'test');
upsert into user(id, account, passwd) values('003', 'zx', 'zx');

-- query data
select * from user;
  • 6.2 执行脚本
1
2
3
4
# cd /home/hadoop/phoenix/bin 

# 这里的uhadoop-xxx-master1:2181是zk地址,如果有多个,则用逗号分割
./psql.py uhadoop-xxx-master1:2181 test.sql

参考文档:

Phoenix global索引:
https://blog.csdn.net/maomaosi2009/article/details/45600109

Phoenix local索引:
https://blog.csdn.net/maomaosi2009/article/details/45619047